package com.example.xunai.service.ai;

import com.example.xunai.dto.request.ai.ChatRequest;
import com.example.xunai.dto.request.ai.StreamChatRequest;
import com.example.xunai.dto.request.ai.BatchChatRequest;
import com.example.xunai.dto.response.ai.ChatResponse;
import com.example.xunai.dto.response.ai.StreamChatResponse;
import com.example.xunai.dto.response.ai.BatchChatResponse;
import com.example.xunai.dto.response.system.ModelConfigResponse;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

import java.util.List;
import java.util.Map;

/**
 * AI聊天统一入口接口
 */
public interface AiChatService {

    // ==================== 流式聊天方法 ====================

    /**
     * 流式聊天
     */
    SseEmitter streamChat(StreamChatRequest request);

    /**
     * 流式聊天（返回响应对象）
     */
    StreamChatResponse streamChatWithResponse(StreamChatRequest request);

    // ==================== 同步聊天方法 ====================

    /**
     * 同步聊天（返回ChatResponse）
     */
    ChatResponse getAiResponse(ChatRequest request);

    /**
     * 异步聊天
     */
    String getAiResponseAsync(ChatRequest request);

    // ==================== 批量聊天方法 ====================

    /**
     * 批量聊天请求
     */
    BatchChatResponse batchChat(BatchChatRequest request);

    // ==================== 流式控制方法 ====================

    /**
     * 设置流式对话停止标志
     */
    void setStreamStopFlag(String sessionId);

    /**
     * 检查流式对话是否应该停止
     */
    boolean shouldStopStream(String sessionId);

    /**
     * 清除流式对话停止标志
     */
    void clearStreamStopFlag(String sessionId);

    // ==================== 其他代理方法 ====================

    /**
     * 获取异步结果
     */
    String getAsyncResult(String requestId);

    /**
     * 获取支持的模型列表
     */
    ModelConfigResponse getSupportedModels();

    /**
     * 恢复中断的流式对话
     */
    List<String> getStreamingMessages(Long conversationId);

    /**
     * 获取默认模型
     */
    String getDefaultModel();

    /**
     * 检查模型是否可用
     */
    boolean isModelAvailable(String modelType);

    /**
     * 获取模型配置信息
     */
    Map<String, Object> getModelConfig(String modelType);

    /**
     * 健康检查方法
     */
    Map<String, Object> healthCheck();

    /**
     * 检查模型配置是否有效
     */
    boolean isModelConfigured(String modelType);

    /**
     * 获取所有已配置的模型类型
     */
    List<String> getConfiguredModelTypes();

    /**
     * 获取配置摘要信息
     */
    Map<String, Object> getConfigSummary();
}